package com.example.tvscreendisplay;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

//接口（如：OnItemClickListener）和实体类（如：ScreenInfo）及class类的实例化，需要使用new关键字来实例化。
// 例如：NewsListAdapter mListAdapter = new NewsListAdapter(MainActivity.this);（摘自MainActivity文件）

public class ScreenInfoListAdapter extends RecyclerView.Adapter<ScreenInfoListAdapter.MyHolder> {

    //程序内部数据源(数据源mRowsDTOS的数据类型为List【接口类型】)
    private List<ScreenInfo.RowsDTO> mRowsDTOS = new ArrayList<>();

    //Context代表程序环境，上下文
    private Context mContext;

    //*************
    //OnItemClickListener是一个自定义的接口，它定义了一个回调方法，用于在特定事件发生时通知外部代码。private OnItemClickListener mListener声明了一个名为mListener的变量，其类型为OnItemClickListener。

    // mListAdapter.setOnItemClickListener(new OnItemClickListener() {
    //
    //            @Override
    //            public void onItemClick(ScreenInfo.RowsDTO rowsDTO) {} }) 是OnItemClickListener接口的实例化，提供了onItemClick方法的具体实现。]。（代码摘自MainActivity文件）
    //***************

    //mListener是OnItemClickListener接口类型变量，并不是实例化，因为没有提供onItemClick方法的具体实现。
    private OnItemClickListener mListener;

    //构造函数
    public ScreenInfoListAdapter(Context mContext) {
        this.mContext = mContext;
    }

    //为adapter 设置数据源
    public void setListData(List<ScreenInfo.RowsDTO> list){
        this.mRowsDTOS = list;

        //这句不可或缺。用于通知RecyclerView的适配器（Adapter）数据已发生变化的方法。当调用notifyDataSetChanged()时，它会触发RecyclerView重新绘制其所有可见的列表项。
        notifyDataSetChanged();
    }

    // 设置监听器的方法
    public void setOnItemClickListener(OnItemClickListener listener) {
        this.mListener = listener;
    }

    @NonNull
    @Override
    public ScreenInfoListAdapter.MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        //布局加载器
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.screeninfo_item,null);

        //初始化MyHolder
        MyHolder holder = new MyHolder(view,mListener);
        // 在ViewHolder中设置点击事件并传递数据：
        // 在onCreateViewHolder方法创建ViewHolder之后，为ViewHolder中的根视图（通常是包含所有子视图的最外层视图）设置点击事件，并在点击事件触发时获取数据并通过接口回调传递数据。
//        holder.itemView.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                int position = holder.getAdapterPosition();
//                if (position!= RecyclerView.NO_POSITION && mListener!= null) {
//                    ScreenInfo.RowsDTO rowsDTO = mRowsDTOS.get(position);
//                    //此处的mListener为实现类(实现了OnItemClickListener接口的对象）,只有实现类才能调用onItemClick方法
//                    // 详见MainActivity文件：new ScreenInfoListAdapter.OnItemClickListener() {public void onItemClick(ScreenInfo.RowsDTO rowsDTO) {} }，
//                    mListener.onItemClick(rowsDTO);
//                }
//            }
//        });
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull MyHolder holder, int position) {

        //绑定数据

        //从适配器内部数据源mDataDTOS中，根据传入的位置参数position获取对应的屏幕数据对象
        ScreenInfo.RowsDTO rowsDTO = mRowsDTOS.get(position);

        holder.name.setText(rowsDTO.getName());
        holder.description.setText(rowsDTO.getDescription());

    }

    @Override
    public int getItemCount() {
        return mRowsDTOS.size();
    }

    class MyHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

        TextView name;
        TextView description;
        Button detail_button;

        private OnItemClickListener mClickListener;// 声明自定义的接口


        public MyHolder(@NonNull View itemView,OnItemClickListener listener) {
            super(itemView);
            mClickListener = listener;

            //绑定控件
            name = itemView.findViewById(R.id.name);
            description = itemView.findViewById(R.id.description);
            detail_button = itemView.findViewById(R.id.detail_button);

            //为Idetail_button按钮添加点击事件
            detail_button.setOnClickListener(this);

        }

        @Override
        public void onClick(View v) {

            //获取点击事件对应的位置
            int position = getAdapterPosition();

            ScreenInfo.RowsDTO rowsDTO = mRowsDTOS.get(position);
            mClickListener.onItemClick(rowsDTO);

        }

    }





}
